[책 읽기]
자바스크립트 자료 구조와 알고리즘 - 로이아니 그로네르
20180914
자바스크립트에서 전역 변수는 ‘악의 축’이란 말을 많이 듣는데, 사실 맞다. 자바스크립트 소스 코드의 품질을 전역 변수와 전역 함수의 개수로 측정할 수 있을 정도다. 전역 변수는 가급적 피하는 편이 좋다.
Truthy와 Falsy
대개의 언어에서 불린 값 true, false는 논리 연산 결과의 참, 거짓을 의미하는데, 자바스크립트에서의 ”Acorn’ 같은 문자열이 true 값을 가질 수도 있다.
| 타입 | 결과 |
|---|---|
| undefined | false |
| null | false |
| Boolean | 참은true, 거짓은 false |
| Number | +0, -0, NaN은 false, 그 밖에는 모두 ture |
| String | 빈 문자열이면 false, 길이가 1 이상인 문자열인 경우는 모두true |
| Object | true(객체는 항상 true) |
내장 메소드 toNumber와 toPrimitive는 다음과 같은 결과값을 만든다.
toNumber의 경우,
| 타입 | 결과 |
|---|---|
| undefined | NaN |
| null | +0 |
| Boolean | true이면 1, false면 +0 |
| Number | 원래 수치 그대로 |
| String | 문자열을 숫자형으로 파싱. 순수 문자로만 구성된 문자열이라면 NaN, 숫자로 구성된 문자열이면 숫자형으로 바뀐 값이다. |
| Object | toNumber(toPrimitive(value)) |
toPrimitive
| 타입 | 결과 |
|---|---|
| Object | valueOf의 결과가 기본 값이라면 기본 값 그대로 반환한다. toString의 결과가 기본값이라면 역시 기본 값 그대로 반환한다. 나머지 경우는 모두 에러다. |
console.log('Acorn' ? true : false); // true
console.log('Acorn' == true); // false
-> toNumber 메소드로 불린 값을 변환하면 Acorn == 1
// 다음 toNumber 메소드로 문자열을 변환하는데, 순수 문자열로 구성된 문자열이므로 결과는 NaN 이다. 따라서 결국 NaN == 1 결과는 false;
console.log('Acorn' == false); // false
-> toNumber 메소드로 불린 값을 변환하면 Acorn == 0
// 다음 toNumber 메소드로 문자열을 변환하는데, 순수 문자열로 구성된 문자열이므로 결과는 NaN 이다. 따라서 결국 NaN == 0 결과는 false;
// 복잡하게 생각하지 말고 ==을 봉인하고, ===을 쓰도록 하자...객체 지향 프로그래밍
var obj = new Object();
var obj = {};
// OOP에서 객체는 클래스의 인스턴스instance이며,
// 클래스는 객체의 특성을 정의한다.
function Book(title, pages, isbn) {
this.title = title;
this.pages = pages;
this.isbn = isbn;
}
클래스의 인스턴스는 다음과 같이 생성한다.
var book = new Book('제목', 123, 9781783554874);
book 객체의 프로퍼티를 조회하거나 고치는 방법 :
console.log(book.title); //도서 제목 출력
book.title = '자바스크립트 자료 구조와 알고리즘'; // 도서 제목 업데이트
console.log(book.title); 업데이트된 제목 출력
클래스는 함수를 가질 수 있다.
Book.prototype.printTitle - function(){
console.log(this.title);
};
book.printTitle();
function Book(title, pages, isbn) {
this.title = title;
this.pages = pages;
this.isbn = isbn;
this.printIsbn = function() {{
console.log(this.isbn);
}}
}
boook.printIsbn();printTitle 함수는 Book 클래스의 모든 인스턴스가 공유할 수 있고, 함수 사본은 1개만 생성된다. 하지만, printIsbn처럼 클래스 내부에 정의한, 클래스 기반 정의 함수는 각 인스턴스 별로 자신의 함수 사본을 갖게 된다. 프로토타입 메소드는 인스턴스에 함수를 할당하는 측면에서 보면 메모리와 처리 비용이 절약되지만, public 함수/프로퍼티만 선언할 수 있다. 클래스 내부에 정의하면 private 함수/프로퍼티를 선언하고 클래스 내부의 다른 함수에서 참조할 수 있다. 이 책의 예제 코드에서는 주로 클래스 기반 정의 함수를 사용하지만(어떤 프로퍼티와 함수는 private로 유지해야 하므로), 가급적 프로토타입 메소드를 사용하는 것이 바람직하다.
-> public 함수/프로퍼티를 선언하는 쪽이 바람직하다고?